package com.ssm.trace;

import org.slf4j.MDC;

import java.util.UUID;

/**
 * 存取TraceID的上下文
 */
public class TraceIdContext {

    // 由于ThreadLocal不能在父子线程中传递，所以此处使用InheritableThreadLocal
    public static final ThreadLocal<String> CURRENT_TRACE_ID = new InheritableThreadLocal<>();

    //生成traceId
    public static String generateTraceId() {
        return UUID.randomUUID().toString();
    }

    //获取traceId
    public static String getTraceId() {
        return MDC.get(TraceIdConstant.TRACE_ID);
    }

    //添加traceId
    public static void setTraceId(String traceId) {
        //MDC允许我们在一个线程的执行上下文中设置和获取键值对，这些键值对在日志输出中可以以占位符的形式被引用，从而在日志信息中输出这些上下文信息
        //%X{PFTID} %x为MDC占位符
        MDC.put(TraceIdConstant.TRACE_ID, traceId);
    }

    //清空traceId
    public static void clearTraceId() {
        CURRENT_TRACE_ID.set(null);
        CURRENT_TRACE_ID.remove();
    }
}
